/**
 * Programme test de Piece
 *
 * @file testPiece.cxx
 */

// Utile pour l'affichage
#include <iostream>
#include <tr1/memory>

#include "Piece.h"
#include "JoueurBlanc.h"
#include "JoueurNoir.h"
#include "Echiquier.h"

// Pour utiliser les flux de iostream sans mettre "std::" tout le temps.
using namespace std;

// Fonction qui teste si 2 pièces sont au même endroit
/*bool test1(const Piece p1, const Piece p2)
{
	return p1.x() == p2.x() && p1.y() == p2.y();
}

// Fonction qui teste si 2 pièces sont au même endroit
bool test2(const Piece &p1, const Piece &p2)
{
	return p1.x() == p2.x() && p1.y() == p2.y();
}*/

/**
 * Programme principal
 */
int main(int argc, char** argv)
{
	/* -------------------- Pointeurs intelligents ------------------- */
	/*cout << "----- Tests sur les shared_ptr -----" << endl;

	// Creation d'un premier pointeur
	tr1::shared_ptr<JoueurNoir> sharedPtr = tr1::shared_ptr<JoueurNoir>(new JoueurNoir);
	cout << "Nb sharedPtr : " << sharedPtr.use_count() << endl;

	// Copie d'un pointeur
	tr1::shared_ptr<JoueurNoir> sharedPtr2 = sharedPtr;
	cout << "Nb sharedPtr : " << sharedPtr.use_count() << endl;
	cout << "Nb sharedPtr2 : " << sharedPtr2.use_count() << endl;

	// Heritage
	tr1::shared_ptr<Joueur> sharedPtr3 = tr1::shared_ptr<Joueur>(new JoueurNoir);
	cout << "Nb sharedPtr : " << sharedPtr.use_count() << endl;
	cout << "Nb sharedPtr2 : " << sharedPtr2.use_count() << endl;
	cout << "Nb sharedPtr3 : " << sharedPtr3.use_count() << endl;*/

	/* -------------------- Echiquier ------------------- */
	cout << endl << "----- Creation Echiquier -----" << endl;

	Echiquier echiquier;
	//echiquier.affiche();

	/* -------------------- Pieces ------------------- */
	/*cout << endl << "----- Creation des Piece -----" << endl;

	// Tableau de pieces
	Piece pieces[4];

	// On initialise la premiere
	pieces[0].init(3, 3, true);

	// p1 est identique a la première piece grace au constructeur par copie
	Piece p1 = pieces[0];

	// On affiche les 2 pieces initialisees
	pieces[0].affiche();
	p1.affiche();*/

	/* -------------------- Joueurs ------------------- */
	cout << endl << "----- Creation JoueurNoir et JoueurBlanc -----" << endl;

	JoueurBlanc joueurBlanc;
	JoueurNoir joueurNoir;

	// On les affiche
	/*joueurBlanc.affiche();
	joueurNoir.affiche();*/

	/* -------------------- Placement des Pieces ------------------- */
	// On place les pieces
	joueurNoir.placerPieces(&echiquier);
	joueurBlanc.placerPieces(&echiquier);

	// On affiche l'echiquier
	echiquier.affiche();

	int joueur = 0;

	while (true)
	{
		int x, y, newX, newY;

		cout << endl << (joueur == 0 ? "----- Joueur blanc -----" : "----- Joueur noir -----") << endl;

		cout << "Pièce a déplacer :" << endl;
		cout << "x : ";
		cin >> x;
		cout << "y : ";
		cin >> y;

		cout << "Coordonnées d'arrivée :" << endl;
		cout << "x : ";
		cin >> newX;
		cout << "y : ";
		cin >> newY;

		PiecePtr piece = echiquier.getPiece(x, y);

		if (piece && piece->mouvementValide(&echiquier, newX, newY))
		{
			echiquier.deplacer(piece, newX, newY);
			echiquier.enleverPiece(x, y);
			echiquier.affiche();
			joueur = (joueur + 1) % 2;
			cout << endl << "[OK] Pièce déplacée" << endl;
			cout << "--------------------" << endl;
		}

		else
			cout << "[Erreur] Impossible de déplacer cette pièce !" << endl;
	}

	/* -------------------- Fonctions de comparaison ------------------- */
	/* Appel de la fonction test1
	cout << endl << "----- Test des pieces 1 -----" << endl;

	if (test1(pieces[0], pieces[1]))
		cout << "Les pièces sont au même endroit" << endl;

	else
		cout << "Les pièces ne sont pas au même endroit" << endl;

	// Appel de la fonction test2
	cout << endl << "----- Test des pieces 2 -----" << endl;

	if (test2(pieces[0], pieces[1]))
		cout << "Les pièces sont au même endroit" << endl;

	else
		cout << "Les pièces ne sont pas au même endroit" << endl;

	cout << endl << "----- Destruction de tous les objets -----" << endl;*/
}
